#pragma once

namespace zrb
{
	template<class Iterator,class Ref,class Ptr>
	struct reverse_Iterator
	{
		typedef reverse_Iterator<Iterator, Ref, Ptr> Self;
		Iterator _cur;

		reverse_Iterator(Iterator it)
			:_cur(it)
		{}

		Ref operator*()
		{
			Iterator tmp = _cur;
			--tmp;
			return *tmp;
		}
		Ptr operator->()
		{
			return *_cur;
		}
		Self& operator++()
		{
			--_cur;
			return *this;
		}
		Self operator++(int)
		{
			Iterator tmp(_cur);
			--_cur;
			return tmp;
		}
		Self& operator--()
		{
			++_cur;
			return *this;
		}
		Self operator--(int)
		{
			Iterator tmp(_cur);
			++_cur;
			return tmp;
		}
		bool operator!=(const Self& s)
		{
			return _cur != s._cur;
		}
	};
}

